home *** CD-ROM | disk | FTP | other *** search
/ Amiga News 95 / Amiga News 95.iso / dpat / dpat01 / search_and_rescue / s&r.asm < prev    next >
Assembly Source File  |  1992-07-21  |  14KB  |  494 lines

  1. ;*****   Search & Rescue Memory   *****
  2.  
  3.  
  4. OpenLib  = -30-378
  5. CloseLib = -414
  6. ExBase   =  4
  7. Open     = -30
  8. Close    = -30-6
  9. Read     = -30-12
  10. Write    = -30-18
  11. IoErr    = -30-102
  12. FindTask = -$126
  13. WaitPort = -$180
  14. GetMsg   = -$174
  15. Forbid   = -$84
  16. ReplyMsg = -$17a
  17. mode_old =  1005
  18. mode_new =  1006
  19. skey     =  $bfec01
  20.  
  21. start:                         ;start prg
  22.  move.l  a7,SPinit             ;save SP
  23.  bsr     Wb                    ;link program with Workbench and initialize
  24.  
  25. mloop:                         ;initialize registers
  26.  move.l  #0,a3
  27.  move.l  #0,a4
  28.  moveq   #0,d4
  29.  bsr     menu
  30.  cmp.b   #12,flag
  31.  beq     bsave                 ;save memory
  32.  cmp.b   #15,flag
  33.  beq     quit                  ;bye-bye 
  34.  cmp.b   #7,flag     
  35.  beq     rdmem                 ;read memory
  36.  cmp.b   #6,flag               ;flag <6: Hex
  37.  bcs     hex                   
  38.  move.l  #messA,d2             ;flag >5: ASCII
  39.  bsr     inpt                  ;read string
  40.  move.l  d6,a0                 ;#inbuff in a0
  41.  move.l  a5,a1                 ;#string in a1
  42. copie:
  43.  move.l  (a0)+,(a1)+           ;copy inbuff in string
  44.  tst.b   (a0)
  45.  bne     copie
  46.  bra.s   suite2
  47. hex:
  48.  move.l  #messH,d2              ;print hex message
  49.  bsr     inpt
  50.  bsr     conv
  51.  move.l  d3,(a5)                ;put hex in string
  52.  move.b  #0,+4(a5)              ;put 0 at the end
  53.  cmp.b   #2,flag                ;is it a word?
  54.  bne     suite2
  55.  add.l   #2,a5                  ;then skip 2 bytes
  56. suite2:
  57.  bsr     fromto                 ;get from and to addrresses
  58.  cmp.b   #15,flag               ;return pressed?
  59.  beq     final
  60.  move.l  #messW,d2              ;print Wait...
  61.  bsr     pmsg 
  62.  move.l  a5,a0                  ;#string in a0
  63.  move.l  d4,a1                  ;from addrress in a1 
  64.  clr.l   d2
  65. encore:
  66.  bsr     hunt                   ;get string address 
  67.  cmp.l   #0,d5                  ;is length = zero?
  68.  beq     mloop                  ;then end; start over again
  69.  move.l  a4,a1                  ;place new start add. in a1
  70.  move.l  a5,a0                  ;restore a0
  71.  bra     encore                 ;else search new occurence within range
  72. rdmem:                          ;read memory
  73.  move.l  con2handle,d7          ;switch screen
  74.  move.l  #memmenu,d2
  75.  bsr     pmsg
  76. rdmem2
  77.  bsr      fromto                ;get from and to addresses
  78.  cmp.b    #15,flag              ;return pressed?
  79.  beq      final
  80.  bsr      memoire               ;read memory
  81.  bra.s    rdmem2
  82. final:                          ;exit MemoScope
  83.  move.l  conhandle,d7           ;go to main menu
  84.  move.l  #memmenu,d2
  85.  bsr     pmsg
  86.  bra     mloop                  ;go back other scren
  87.  
  88. Wb:                             ;link prg with Workbench
  89.  movea.l ExBase,a6
  90.  suba.l  a1,a1
  91.  jsr     FindTask(a6) 
  92.  move.l  d0,task
  93.  movea.l d0,a4
  94.  tst.l   $ac(a4)               ;called from Workbench?
  95.  bne     init                  ;no, from CLI
  96.  lea     $5c(a4),a0            ;get message
  97.  jsr     WaitPort(a6)
  98.  lea     $5c(a4),a0
  99.  jsr     GetMsg(a6)
  100.  move.l  d0,wbmsg
  101. init:                         ;System initialization
  102.  move.l  ExBase,a6            ;Pointer to  EXEC library
  103.  lea     dosname(pc),a1
  104.  moveq   #0,d0
  105.  jsr     OpenLib(a6)          ;Open DOS.Library
  106.  move.l  d0,dosbase
  107.  beq     error
  108.  lea     con2name(pc),a1      ;Con2 Definition
  109.  move.l  #mode_old,d0
  110.  bsr     openfile             ;Console open
  111.  beq     error
  112.  move.l  d0,con2handle
  113.  lea     consolname(pc),a1    ;Console Definition
  114.  move.l  #mode_old,d0
  115.  bsr     openfile             ;Console open
  116.  beq     error
  117.  move.l  d0,conhandle
  118.  move.l  d0,d7                ;current handle in d7
  119.  lea     inbuff,a1             
  120.  move.l  a1,d6                ;#inbuff in d6
  121.  lea     string,a5            ;#string in a5
  122.  rts
  123.  
  124. menu:                         ;set the flag 
  125.  move.l #menumess,d2
  126.  bsr    pmsg
  127.  move.l #80,d3
  128.  bsr    getchr
  129.  move.l d6,a1
  130.  move.b (a1),d0
  131.  cmp.b  #'a',d0
  132.  beq    sort1
  133.  cmp.b  #'w',d0
  134.  beq    sort2
  135.  cmp.b  #'l',d0
  136.  beq    sort4
  137.  cmp.b  #'s',d0
  138.  beq    sort5
  139.  cmp.b  #'q',d0
  140.  beq    sort6
  141.  cmp.b  #'m',d0
  142.  beq    sort7
  143.  bra.s  menu
  144. sort1:
  145.  move.b #10,flag               ;ASCII
  146.  rts
  147. sort2:
  148.  move.b #2,flag                ;Hex Word
  149.  rts
  150. sort5:
  151.  move.b #12,flag               ;Save
  152.  rts
  153. sort6:
  154.  move.b #15,flag               ;Quit
  155.  rts
  156. sort7:
  157.  move.b #7,flag                ;Read Memory
  158.  rts
  159. sort4:
  160.  move.b #1,flag
  161.  rts                           ;Hex Long Word
  162.  
  163. openfile:                      ;Open File
  164.  move.l a1,d1                  ;Pointer to I/O-Definition
  165.  move.l d0,d2
  166.  move.l dosbase,a6
  167.  jsr    Open(a6)
  168.  tst.l  d0
  169.  rts
  170. openfileD:                     ;open disk file
  171.  move.l  #mode_new,d2
  172.  movea.l d6,a1
  173.  move.l  a1,d1
  174.  move.l  dosbase,a6 
  175.  jsr     Open(a6)
  176.  move.l  d0,filehd
  177.  rts
  178. closefileD:                    ;close disk file
  179.  move.l  dosbase,a6
  180.  move.l  filehd,d1
  181.  jsr     Close(a6)
  182.  rts
  183.  
  184. fromto:                        ;get from and to addresses
  185.  move.l  #mess2,d2
  186.  bsr     inpt                  ;read start address
  187.  cmp.b   #15,flag              ;is it single CR?
  188.  beq     retour                ;then exit 
  189.  bsr     conv                  ;convert to hex
  190.  move.l  d3,d4                 ;save it in d4
  191.  move.l  #mess3,d2
  192.  bsr     inpt                  ;read end address
  193.  cmp.b   #15,flag              ;is it single CR?
  194.  beq     retour                ;then exit 
  195.  bsr     conv                  ;convert to hex
  196.  sub.l   d4,d3                 ;compute length in d3
  197.  move.l  d3,d5                 ;copy length in d5
  198. retour:
  199.  rts
  200.  
  201. pmsg:                          ;print message to screen
  202.  movem.l d0-d7/a0-a6,-(sp)     ;save registers to stack
  203.  move.l  d2,a0 
  204.  clr.l   d3
  205. boucle:
  206.  tst.b   (a0)+
  207.  beq     psuite
  208.  addq.l  #1,d3
  209.  bra     boucle                ;compute length in d3
  210. psuite:
  211.  move.l  d7,d1
  212.  move.l  dosbase,a6
  213.  jsr     Write(a6)
  214.  movem.l (sp)+,d0-d7/a0-a6     ;reload registers from stack
  215.  rts
  216.  
  217. inpt:                          ;output message & input string
  218.  bsr      pmsg
  219.  move.l   #80,d3
  220.  bsr      getchr               ;get string
  221.  move.l   d6,a1                
  222.  move.b   (a1),d0
  223.  cmp.b    #10,d0               ;is it single CR?
  224.  beq      putflag              ;then flag it
  225. place0:
  226.  add.l    d5,a1
  227.  clr.l    d5
  228.  move.b   #0,-(a1)             ;place '00' over '0a'
  229.  rts
  230. putflag:                       ;put #15 in flag 
  231.  move.b   #15,flag
  232.  bra.s    place0
  233.  
  234. getchr:                        ;get string for keyboard
  235.  move.l  d7,d1                 ;curent screen handle in d1
  236.  move.l  d6,d2                 ;put #inbuff in d2
  237.  move.l  dosbase,a6
  238.  jsr     Read(a6)
  239.  move.l  d0,d5                 ;string length in d5
  240.  rts
  241.  
  242. hunt:                          ;search string in memory
  243.  clr.l  d2
  244.  cmpm.b (a0)+,(a1)+            ;compare byte to byte
  245.  beq    ste1
  246.  move.l a5,a0                  ;restore  string address
  247.  sub.l  #1,d5                  ;decrement length
  248.  tst.l  d5                     ;is it zero?
  249.  bne    hunt                   ;no: then go back
  250.  move.l #mess4,d2              ;yes: print message & exit
  251.  bra.s  rien 
  252. ste1:
  253.  sub.l  #1,d5                  ;decrement length
  254.  tst.b  (a0)                   ;end of string?
  255.  beq    exit
  256.  add.l  #1,d2                  ;increment string counter
  257.  cmpm.b (a0)+,(a1)+            ;check next byte
  258.  beq    ste1
  259.  sub.l  #1,d5                  ;decrement length
  260.  move.l a5,a0                  ;restore string address
  261.  bra.s  hunt
  262. exit:
  263.  add.l  #1,d2
  264.  move.l a1,a3        
  265.  move.l a1,a4                  ;copy found address in a4
  266.  sub.l  d2,a3                  ;beginning of found address in a3
  267.  bsr     conv2                 ;place converted address in inbuff
  268.  move.l  d6,d2                 ;#inbuff in d2
  269. rien:
  270.  bsr     pmsg                  ;print address or Not found
  271.  rts
  272.  
  273. bsave:                         ;save memory in a file
  274.  move.l  #messF,d2
  275.  bsr     inpt                  ;read filename
  276.  bsr     openfileD             ;open disk file
  277.  beq     error
  278.  bsr     fromto                ;get from and to addresses
  279.  move.l  d4,d2                 ;put start add in d2
  280.  move.l  filehd,d1
  281.  move.l  dosbase,a6
  282.  jsr     Write(a6)
  283.  bsr     closefileD            ;close file
  284.  bra     mloop
  285.  
  286. memoire:                       ;read memory
  287.  moveq   #0,d5
  288.  move.l  d3,long               ;save length
  289.  moveq   #4,d3
  290.  swap    d4                    ;align start address (d4) 
  291.  move.l  d4,stad
  292.  clr.w   d4
  293.  swap    d4
  294.  divu    d3,d4
  295.  swap    d4
  296.  clr.w   d4
  297.  swap    d4
  298.  mulu    d3,d4
  299.  move.w  d4,stad               ;save start address 
  300.  move.l  stad,d4
  301.  swap    d4
  302. mem1:
  303.  move.l  d4,a3                 ;start address in a3
  304.  bsr     conv2                 ;convert in ASCII
  305.  move.l  d6,d2 
  306.  bsr     pmsg                  ;print start address
  307.  move.l  #points,d2         
  308.  bsr     pmsg                  ;print spacer
  309.  move.l  d4,a4                 ;copy st. add. in a4
  310.  move.l  #15,d5
  311.  lea     string,a5
  312. cop2:                          ;copy 4 long words in 2nd buffer
  313.  move.l  (a4)+,(a5)+
  314.  dbra    d5,cop2
  315.  lea     string,a5 
  316.  move    #3,d5                 ;3 in counter (d5)
  317. quatre:
  318.  move.l  (a5)+,a3              ;load a3
  319.  bsr     conv2                 ;convert in ASCII
  320.  move.l  d6,d2
  321.  bsr     pmsg
  322.  dbra    d5,quatre             ;print 4 long words
  323.  move.l  #points,d2
  324.  bsr     pmsg                  ;print spacer
  325.  lea     string,a5             ;restore a5             
  326.  move    #15,d5                ;restore 15 in counter (d5)
  327.  move.l  #1,d3                 ;1 in d3
  328.  lea     string,a5             ;restore a5
  329. seize:
  330.  bsr    ctrl                   ;check for unprintable char.
  331.  bsr    pchar                  ;print one char.
  332.  dbra   d5,seize               ;print 16 char.
  333.  move.l #cr,d2              
  334.  bsr    pmsg                   ;print a CR 
  335.  move.l long,d3 
  336.  sub.l  #16,d3                 ;update lenght
  337.  move.l d3,long
  338.  cmp.b  #$39,skey              ;CTRL pressed?
  339.  beq    finboucle
  340.  add.l  #16,d4                 ;update address to read
  341.  cmp.w  #$f000,d3              ;lenght = 0?
  342.  bcs    mem1                   ;next 16 bytes
  343. finboucle:
  344.  rts
  345. ctrl:                       
  346.  cmp.b  #32,(a5)               ;change control characters (<32)
  347.  bcs    efface
  348.  cmp.b  #126,(a5)            
  349.  bcc    eff2
  350. cont:
  351.  move.l a5,d2
  352.  add.l  #1,a5                  ;update counter
  353.  rts
  354. efface:
  355.  move.b #'.',(a5)
  356.  bra.s  cont
  357. eff2:                          ;change invisible char. (127-159)
  358.  cmp.b #161,(a5)
  359.  bcc   out
  360.  move.b #'.',(a5)
  361. out:
  362.  bra.s  cont
  363. pchar:                         ;print message to screen
  364.  movem.l d0-d7/a0-a6,-(sp)
  365.  move.l  d2,a0
  366.  move.l  d7,d1
  367.  jsr     Write(a6)
  368.  movem.l (sp)+,d0-d7/a0-a6
  369.  rts 
  370.  
  371. conv:                          ;convert ASCII to hex
  372.  clr.l     d3                  ;input = d3
  373.  move.l    d6,a0               ;inbuff
  374.  jsr       hexinloop
  375.  rts
  376. hexinloop:
  377.  bsr       nibblein
  378.  cmp       $10,d0
  379.  bcc       hexinok             ; Test if good
  380.  lsl.l     #4,d3               ; Shift result
  381.  or.b      d0,d3               ; Insert nibble
  382.  bra       hexinloop           ; And continue
  383. hexinok:
  384.  rts
  385. nibblein:                      ; Convert the nibble from (A0)
  386.  clr.l     d0                  ; Erase D0
  387.  move.b    (a0)+,d0            ; Get digit, increment A0
  388.  sub       #'a',d0             ; Subtract $61
  389.  bcc       ischar              ; No problem, in the range a-f
  390.  add       #39,d0              ; Else correct value
  391. ischar:
  392.  add       #10,d0              ; Correct value
  393.  rts 
  394.  
  395. conv2:                         ;convert hex to ASCII
  396.  move.l   d6,a0                ;#inbuff in a0
  397.  clr.l    d3
  398.  clr.l    d2
  399.  move     #7,d3                ; Counter in d3
  400.  move.l   a3,d1                ; address to convert in d1
  401. lp:
  402.  rol.l    #4,d1                ; Move upper nibble into lower
  403.  move     d1,d2                ; Write in d2
  404.  bsr      nibble               ; And convert it
  405.  move.b   d2,(a0)+             ; Character in buffer
  406.  dbra     d3,lp                ; Repeat 8 times
  407.  move.w   #$2000,(a0)          ; Put space + 0 at the end of the string
  408.  rts
  409. nibble:
  410.  and      #$0F,d2              ; Just keep low byte
  411.  add      #$30,d2              ; Add $30
  412.  cmp      #$3A,d2              ; Was it a digit?
  413.  bcs      ok                   ; Yes, done
  414.  add      #39,d2               ; Else add 39
  415. ok:
  416.  rts                           ; Bye-bye
  417.  
  418. error: 
  419.  move.l  dosbase,a6
  420.  jsr     IoErr(a6)
  421.  move.l  d0,d6
  422.  
  423. quit:
  424.  move.l  con2handle,d1         ;window close
  425.  move.l  dosbase,a6 
  426.  jsr     Close(a6)
  427.  move.l  conhandle,d1          ;window close
  428.  move.l  dosbase,a6
  429.  jsr     Close(a6)
  430.  move.l  dosbase,a1            ;DOS.Lib close
  431.  move.l  ExBase,a6
  432.  jsr     CloseLib(a6)
  433.  tst.l  wbmsg                  ;close Workbench if opened
  434.  beq.s  fin
  435.  jsr    Forbid(a6)
  436.  move.l wbmsg,a1
  437.  jsr    ReplyMsg(a6)
  438. fin:
  439.  moveq  #0,d0
  440.  move.l SPinit,a7
  441.  rts 
  442.  
  443. SPinit:     dc.l 0
  444. task:       dc.l 0
  445. wbmsg:      dc.l 0
  446. long:       dc.l 0
  447. inbuff:     ds.l 20
  448.  even
  449. string:     ds.l 20
  450.  even
  451. dosname:    dc.b "dos.library",0,0
  452.  even
  453. dosbase:    dc.l 0
  454. con2name: dc.b "CON:0/0/600/100/** MemoScope - Enter [CTRL] to stop, [RETURN] to exit **",0
  455.  even
  456. consolname: dc.b "CON:0/100/600/100/** Search & Rescue **",0
  457.  even
  458. conhandle:  dc.l 0
  459. con2handle: dc.l 0
  460. filehd:     dc.l 0
  461. flag:       dc.l 0
  462. stad:       dc.l 0
  463. memmenu:    dc.w $1b63
  464.             dc.b 'Click this screen on.',10,0
  465.  even
  466. menumess:   dc.b ' ',10
  467.             dc.b '** Search & Rescue v1.0  * THE UNCRASHER *   M. Laliberté, oct. 88 **',10
  468.             dc.b '    * [A]SCII * [W]ord * [L]ong Word * [S]ave * [M]emory * [Q]uit *',10
  469.             dc.b '-',0
  470.  even
  471. messA:      dc.b "Enter ASCII string, max. 40 characters (case sensitive)",10
  472.             dc.b '-',0
  473.  even
  474. messH       dc.b 'Enter HEX     :-------- 4 or 8 digits, a-f lower case only.',10
  475.             dc.b '             -$',0
  476.  even
  477. mess2:      dc.b 'From address:-$',0
  478.  even
  479. mess3:      dc.b 'To address  :-$',0
  480.  even
  481. messW:      dc.b 'Wait...  ',0
  482.  even
  483. mess4:      dc.b 'End Hunt',10,0
  484.  even
  485. messF:      dc.b 'Filename (full path): -',0
  486.  even
  487. points:     dc.b ': ',0
  488.  even
  489. cr:         dc.b ' ',10,0
  490.  even
  491.  
  492.  end
  493.  
  494.